package sn.gandal.agriculture.agrimobile.j2me.gui;

import java.io.IOException;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.rms.RecordStoreException;
import sn.gandal.agriculture.agrimobile.j2me.businessObjects.Paysans;
import sn.gandal.agriculture.agrimobile.j2me.businessObjects.BusinessServicesImpl;
import sn.gandal.agriculture.agrimobile.j2me.businessObjects.IBusinessServices;

/**
 *
 * @author dysow
 */
public class IdentificationForm extends Form implements CommandListener
{

    private MIDlet midlet;
    private Display display;
//    private MainMenu mainMenu = null;
    private GestionTransmissionMenu gestionTransmissionMenu = null;
    private DeleteInfoForm deleteInfoForm = null;
    private TextField txtIdentifiant;
    private Command cmdOk;
    private Command cmdQuit;
    private final static int MAXIMUM_SIZE = 4;
    private MainMenu mainMenu;

    /*
     * Il faut utiliser ici les service business
     *
     */
    public IdentificationForm(MIDlet midlet, Display display)
    {
	super("Identification");

	this.midlet = midlet;
	this.display = display;

	this.initialiseComponents();
	this.addComponents();
	this.initialiseCommands();
	this.addCommands();
	this.setCommandListener(this);
    }

    private void initialiseComponents()
    {
	this.txtIdentifiant = new TextField("Identifiant", "", IdentificationForm.MAXIMUM_SIZE, TextField.NUMERIC);
    }

    private void initialiseCommands()
    {
	this.cmdOk = new Command("Ok", Command.OK, 1);
	this.cmdQuit = new Command("Quitter", Command.EXIT, 2);
    }

    private void addComponents()
    {
	this.append(this.txtIdentifiant);
    }

    private void addCommands()
    {
    System.out.println("Ajout des commands dans IdentificatioForm : ");
    IBusinessServices service=BusinessServicesImpl.getInstance();
     System.out.println("service instancié : ");
//    boolean load = false;
//        try {
//            load = service.isAbonneLoaded();
//        } catch (RecordStoreException ex) {
//            ex.printStackTrace();
//            System.out.println("une exception a été jetée !! ");
//        }
//    if(!load){
      //  System.out.println("Au moins un abonné a été chargé : "+load);
        this.addCommand(this.cmdQuit);
   // }
	this.addCommand(this.cmdOk);
	
    }

    /**
     * Sauvegarder l'identifiant
     */
    private void sauvegarderAction()
    {
	IBusinessServices businessServices = BusinessServicesImpl.getInstance();
	Paysans agentDePesee = new Paysans(Integer.parseInt(this.txtIdentifiant.getString()));

	String agentDePeseeStr = this.txtIdentifiant.getString();

	boolean valid = false;//businessServices.validerSauvegardeIdentifiant(agentDePesee);

	if (!valid)
	{
	    String error = "Erreur Identifiant\nL'identifiant doit être composé de 4 chiffres";
	    this.display.setCurrent(new ErrorsForm(error), this);
	}
	else
	{
            /*
             * Si l'adp vient du menu changement identifiant, alors on verifie quand même si le nouveau code rentré n'est pas le
             * même que celui qui existe dejà dans le telephone. Si ce n'est pas le même, on supprime toutes les données et on
             * enregistre l'id du nouvel adp.
             */

	    boolean resultat = businessServices.agentDePeseeExists(agentDePeseeStr);
            System.out.println("L'adp saisi existe t-il dans le telephone ? :"+resultat);
	    if (!resultat)
	    {
                Paysans adpExistingInStore =null;
                      
                        //    adpExistingInStore = businessServices.getAgentDePeseeEnregistre();
                            System.out.println("Existe-t-il un adp dans le store ? "+adpExistingInStore.getIdAdp());
                       
                if(adpExistingInStore.getIdAdp()!=-1){
                    //Celà veut dire qu'on va devoir supprimer des données
                    System.out.println("Un autre utilisateur possède des données" +
                            "sur ce teléphone. Une déconnexion entrenera la suppression de toutes " +
                            "ses données. Êtes vous sur de vouloir le déconnecter ?");
                    this.display.setCurrent(this.getDeleteInfoForm());
                }else{
                    //Celà veut dire qu'il faudra une nouvelle connection --> on persiste les données
                    //et on swwitch vers transmissionsDonneesForm
                    System.out.println("Aucun adp n'a été trouvé dans le store --> nouvelle connexion ");
                    saveNewAdp();
                }

	    }
	    else
	    {
		String succes = "Cet utilisateur est dejà identifié et possède des données sur ce telephone !";
		this.display.setCurrent(ConfirmationForm.ConfirmAction(succes), this.getMainMenu());
//		InformationForm informationForm = new InformationForm(this.display, this.getMainMenu());
//		informationForm.setMessage(succes);
//		this.display.setCurrent(informationForm);
	    }
	}
    }

    private void quitAction()
    {
	this.midlet.notifyDestroyed();
    }

    public void commandAction(Command c, Displayable d)
    {
	if (c.equals(this.cmdOk))
	{
	    this.sauvegarderAction();
	}
	else if (c.equals(this.cmdQuit))
	{
	    this.quitAction();
	}
    }

    private GestionTransmissionMenu getGestionTransmissionMenu()
    {
	if (this.gestionTransmissionMenu == null)
	{
	    this.gestionTransmissionMenu = new GestionTransmissionMenu(this.display, this, this.midlet);
	}

	return this.gestionTransmissionMenu;
    }

    //////////////////////////////
    /**
     *Supprimer toutes les données existant
     */
    public void deleteInfo()
    {
	IBusinessServices iBusinessServices = BusinessServicesImpl.getInstance();

	iBusinessServices.deleteAllData();

	//this.display.setCurrent(alert, this.getGestionAbonneMenu());
	this.display.setCurrent(ConfirmationForm.ConfirmAction("Les données sont effacées !!"), this);
    }

    /**
     * Sauvegarder le nouveau Paysans
     */
    public void saveNewAdp()
    {
	IBusinessServices businessServices = BusinessServicesImpl.getInstance();
	Paysans agentDePesee = new Paysans(Integer.parseInt(this.txtIdentifiant.getString()));

	boolean resultat =false; // businessServices.enregistrerIdentifiantAgentDePesee(agentDePesee);

	if (resultat)
	{
	    this.display.setCurrent(this.getGestionTransmissionMenu());
	}
	else
	{
	    String errors = "Il y eu une erreur pendant l'enregistrement de l'identifiant. Veuillez re-essayer";
	    this.display.setCurrent(new ErrorsForm(errors), this);
	}
    }

    private DeleteInfoForm getDeleteInfoForm()
    {
	if (this.deleteInfoForm == null)
	{
	    this.deleteInfoForm = new DeleteInfoForm(this.display, this, this);
	}

	return this.deleteInfoForm;
    }

    private MainMenu getMainMenu()
    {
	if (this.mainMenu == null)
	{
	    //this.mainMenu = new MainMenu(midlet);
	    this.mainMenu = new MainMenu(this.midlet);
	}

	return this.mainMenu;
    }
}
